package com.iwuyc.tools.commons.concurrency;

import java.util.Optional;
import java.util.concurrent.TimeUnit;

public interface ConcurrencyTokenService {

    /**
     * 获取token实例，如果超过指定时间依然未获取到token，则返回 {@link Optional#empty()}
     *
     * @param timeout     超时时间
     * @param timeoutUnit 超时时间的单位
     * @return token实例，是一个可自动关闭的对象，关闭后可自动归还token，应当注意，租借方，无论发生任何状况，都应当记得归还该对象，否则会影响后续的并发流程
     * @throws InterruptedException 线程中断异常
     */
    Optional<ConcurrencyToken> take(long timeout, TimeUnit timeoutUnit) throws InterruptedException;

    /**
     * 设置并发数
     *
     * @param concurrency 并发数
     * @return 是否设置成功
     */
    boolean concurrency(int concurrency);

    /**
     * 并发token实例
     *
     * @author 吴宇春
     * @version 1.0.0
     * @since  2023-09-22
     */
    interface ConcurrencyToken extends AutoCloseable {
        @Override
        default void close() {

        }
    }

}
